package com.zenithmind.disk.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.disk.pojo.domain.Files;
import com.zenithmind.disk.pojo.dto.FileDTO;
import com.zenithmind.disk.pojo.query.FileQuery;
import com.zenithmind.disk.pojo.vo.FileVO;
import com.zenithmind.common.result.PageResult;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

public interface FilesService extends IService<Files> {

    /**
     * 上传文件
     * @param file 文件
     * @param userId 用户ID
     * @param parentId 父级目录ID
     * @return 文件信息
     */
    FileVO uploadFile(MultipartFile file, String userId, String parentId);

    /**
     * 创建文件夹
     * @param fileDTO 文件夹信息
     * @return 文件夹信息
     */
    FileVO createFolder(FileDTO fileDTO);

    /**
     * 列出文件和文件夹
     * @param userId 用户ID
     * @param parentId 父级目录ID
     * @return 文件列表
     */
    List<FileVO> listFiles(String userId, String parentId);

    /**
     * 重命名文件或文件夹
     * @param fileDTO 文件信息
     * @return 更新后的文件信息
     */
    FileVO renameFile(FileDTO fileDTO);

    /**
     * 移动文件或文件夹
     * @param fileId 文件ID
     * @param targetId 目标文件夹ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean moveFile(String fileId, String targetId, String userId);

    /**
     * 删除文件或文件夹（移入回收站）
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteFile(String fileId, String userId);

    /**
     * 获取文件信息
     * @param fileId 文件ID
     * @return 文件信息
     */
    FileVO getFileInfo(String fileId);

    /**
     * 根据文件ID获取文件物理路径（用于下载）
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 文件物理路径
     */
    String getFilePath(String fileId, String userId);

    /**
     * 下载文件
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 文件物理路径
     */
    String downloadFile(String fileId, String userId);

    /**
     * 递归将文件夹内容添加到ZIP流中
     * @param folderId 文件夹ID
     * @param folderPath 文件夹在ZIP中的路径
     * @param userId 用户ID
     * @param zipOut ZIP输出流
     * @throws IOException 如果发生I/O错误
     */
    void addFolderToZip(String folderId, String folderPath, String userId, java.util.zip.ZipOutputStream zipOut) throws IOException;

    /**
     * 通过文件ID获取文件的物理路径，不检查文件状态（用于删除操作）
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 文件物理路径
     */
    String getFilePathForDelete(String fileId, String userId);
    
    /**
     * 下载目录为zip文件
     * @param folderId 文件夹ID
     * @param response HTTP响应对象
     * @throws IOException 如果发生I/O错误
     */
    void downloadDirectory(String folderId, HttpServletResponse response) throws IOException;

    /**
     * 分页查询文件列表
     * @param fileQuery 文件查询条件
     * @return 分页查询结果
     */
    PageResult<FileVO> filePage(FileQuery fileQuery);

    /**
     * 批量删除文件-管理员
     * @param ids 文件ID列表
     * @return 是否成功
     */
    boolean deleteBatchFiles(List<String> ids);

    /**
     * 管理员添加或修改文件信息
     * @param file 文件信息
     * @return 文件信息
     */
    FileVO addOrUpdateFileByAdmin(Files file);
}
